Ndertimi i nje baze te dhenash reale
Per te kuptuar me mire deklaratat SQL do te paraqesim nje shembull me real te krijimit te nje baze te dhenash. Bazen e te dhenave te cilen do te krijojme ne vijim do t'a perdorim per nje projekt real, te cilin do t'a ndertojme ne nje nder kapitujt ne vijim. Meqenese jemi tek nje kapitull i cili trajton PHP-ne me MySQL, ne kete seksion do te ndertojme databazen te cilen do t'a perdorim me vone.
Projekti qe do te bejme konsiston ne nje faqe web, faqja e Fakultetit te Teknologjise se Informacionit. Kjo faqe do te sherbeje me shume qe te publikoje njoftimet dhe artikujt e fundit, te postuara nga pedagoge te departamenteve te ndryshme. Artikujt dhe njoftimet do te grupohen sipas departamenteve. Perdoruesit qe do te perdorin faqen jane 3 lloje:
Vizitor - Ky lloj perdoruesi mund te kryeje veprimet e meposhtme:
- Te vizitoje faqen web, dhe te shikoje njoftimet dhe artikujt e fundit te grupuara sipas departamenteve
Pedagog - Ky lloj perdoruesi mund te kryeje veprimet e meposhtme:
- Te vizitoje faqen web, dhe te shikoje njoftimet dhe artikujt e fundit te grupuara sipas departamenteve
- Te logohet ne faqe me ane te email dhe fjalekalim. Pasi te logohet mund:
- Te postoje artikuj ne emer te departamentit te vet
- Te postoje njoftime ne emer te departamentit te vet
Administrator - Ky lloj perdoruesi mund te kryeje veprimet e meposhtme:
- Te vizitoje faqen web, dhe te shikoje njoftimet dhe artikujt e fundit te grupuara sipas departamenteve
- Te logohet ne faqe me ane te email dhe fjalekalim. Pasi te logohet mund:
- Te krijoje nje perdorues te ri te sistemit
Per nje sistem te tille na nevojitet nje baze te dhenash me 4 tabela.
Per te krijuar nje baze te dhenash na duhet nje sistem per menaxhimin e bazave te te dhenave. Ne do te perdorim sistemin MySQL. Per te menaxhuar nje sistem te tille ekzistojne softuer me paraqitje grafike, por mund te behet edhe me ane te komandave duke perdorur aplikacione te tilla si Terminal ne sistemet Linux apo Mac, ose Command Promt ne sistemet Windows. Aplikacionet me komanda kerkojne njohuri pak te avancuara per nje fillestar, por mund te perdorni lehtesisht nje softuer me paraqitje grafike sic eshte MySQL Workbench i cili eshte falas per t'u shkarkuar.
Bazat e te dhenave zakonisht ndertohen ne servera te dedikuar vetem per to, por ne rastin tone ne mund te perdorim edhe kompjuterin tone lokal duke e transformuar si server. Per kete mjafton te kemi instaluar nje softuer si p.sh. XAMP i cili rrit funksionalitetin ne kompjuterint tone duke sherbyer edhe si server. Normalisht cdo server ka nevoje per nje IP qe te krijojme nje lidhje me te. Po kompjuteri yne ne kete rast me cfare IP-je aksesohet si server? Kemi permendur edhe me pare, qe kompjuteri yne aksesohet me IP-ne 127.0.0.1
ose thjesht duke shkruajtur localhost
.
Kur hapim programin MySQL Workbench ne menyre qe te punojme me bazen e te dhenave ne kompjuterin lokal, nevojitet qe fillimisht te kemi startuar programin XAMP dhe te kemi nisur START
seksionin MySQL Server
. Me pas, ne programin MySQL Workbench duhet te krijojme nje lidhje te re ne seksionin Connections
. Kjo lidhje na kerkon tre parametra kryesore:
- Host - Eshte IP-ja e serverit me te cilin do te lidhemi. Dukeqenese punojme ne kompjuterin lokal shenojme
127.0.0.1
ose thjesht tekstinlocalhost
- User dhe Password - Kerkon te specifikojme me cfare perdoruesi do te hyjme ne serverin e bazes se te dhenave. Ashtu sic mund te logohemi me username dhe password ne kompjuterat tane Windows, Linux apo Mac, edhe nje server i tille MySQL kerkon qe ti hyjme me username dhe password. Lind pyetja kur e kemi vendosur nje username? Username dhe password vendosen kur instalojme per here te pare teknologji si
XAMP
oseMySql Server
, ose krijohet automatikisht vete perdoruesi me usernameroot
dhe pa password.
Pasi te kemi futur te dhenat e nevojshme dhe te klikojme per t'u lidhur do te krijohet nje lidhje me serverin lokal dhe do te na listohen databazat aktuale. Ne rast se nuk e kemi perdorur kurre me pare aty mund te gjendet vetem ndonje databaze konfigurimi e vete serverit MySQL
. Ne nje pjese tjeter te programit ndodhet ajo cfare na intereson me shume, vendi ku do te shkruajme deklaratat SQL per t'i ekzekutuar.
Fillojme me krijimin e bazes se te dhenave te cilen do ta quajme fakulteti
:
CREATE DATABASE fakulteti;
Pasi ekzekutojme komanden e mesiperme do te shohim qe ne listen e databazave do te shtohet edhe databaza me emrin fakulteti
.
Databaza jone do te kete 4 tabela:
departamentet
- Do te mbaje listen e departamenteve te fakultetit, dhe do te perbehet nga fushat e meposhtme:id
- Do te jete celes primar sepse eshte identifikues unik.
- Nuk do te pranoje vlera
NULL
sepse duhet te jete gjithnje numer, i tipitint
- Do te jete
AUTO_INCREMENT
ne menyre qe kur te shtojme departament te ri, id-ja te gjenerohet automatikisht
emri
- Do te mbaje emrin e departamentit
- Do te jete i tipit varchar qe pranon maksimumi 100 karaktere
- Nuk duhet te pranoje vleren
NULL
sepse nuk ka sens nje departament me nje emer te tille
pershkrimi
- Do te mbaje nje pershkrim te departamentit nese eshte i nevojshem, perndryshe
NULL
- Do te jete i tipit
text
- Do te mbaje nje pershkrim te departamentit nese eshte i nevojshem, perndryshe
perdoruesit
- Do te mbaje listen e departamenteve te fakultetit, dhe do te perbehet nga fushat e meposhtme:id
- Do te jete celes primar sepse eshte identifikues unik.
- Nuk do te pranoje vlera
NULL
sepse duhet te jete gjithnje numer, i tipitint
- Do te jete
AUTO_INCREMENT
ne menyre qe kur te shtojme perdorues te ri, id-ja te gjenerohet automatikisht
emri
- Do te mbaje emrin e perdoruesit
- Do te jete i tipit
varchar
qe pranon maksimumi 80 karaktere - Nuk duhet te pranoje vleren
NULL
sepse nuk ka sens nje perdorues pa emer
email
- Do te mbaje e-mailin e perdoruesit me ane te te cilit mund te logohet ne faqe
- Do te jete i tipit
varchar
me maksimumi 50 karaktere. - Nuk duhet te pranoje vleren
NULL
sepse perdoruesi duhet te kete patjeter nje email
password
- Do te mbaje fjalekalimin e perdoruesit me ane te te cilit do te logohet ne faqe
- Do te jete i tipit
varchar
me maksimumi 100 karaktere. - Nuk duhet te pranoje vleren
NULL
sepse perdoruesi duhet te kete patjeter nje fjalekalim
tipi
- Do te jete i nje lloj tipi te vecante te quajtur
SET('0', '1')
i cili mban vleren0
ose vleren1
- Vlera
0
tregon qe perdoruesi eshte administrator, ndersa vlera1
tregon qe perdoruesi eshte pedagog - Vlera
default
do te jete1
- Do te jete i nje lloj tipi te vecante te quajtur
id_departament
- Do te jete
FOREIGN KEY
qe referencon fushenid
te tabelesdepartamentet
- Do te jete i tipit
int
pasi referencon nje fushe te ketij tipi - Mund te mbaje edhe vleren
NULL
sepse perdoruesit e tipit0
(administrator) nuk duhet te jene te lidhur me departamentin, ndersa pedagoget po.
- Do te jete
artikujt
- Do te mbaje listen e artikujveid
- Do te jete celes primar sepse eshte identifikues unik.
- Nuk do te pranoje vlera
NULL
sepse duhet te jete gjithnje numer, i tipitint
- Do te jete
AUTO_INCREMENT
ne menyre qe kur te shtojme artikull te ri, id-ja te gjenerohet automatikisht
titulli
- Do te mbaje titullin e artikullit
- Do te jete i tipit
varchar
qe pranon maksimumi 255 karaktere - Nuk duhet te pranoje vleren
NULL
sepse nuk ka sens nje artikull pa titull
pershkrimi
- Do te mbaje permbajtjen e artikullit
- Do te jete i tipit
text
- Nuk duhet te pranoje vleren
NULL
sepse nuk ka sens nje artikull pa permbajtje
data
- Do te mbaje daten e krijimit te artikullit
- Do te jete i tipit
date
- Nuk duhet te pranoje vleren
NULL
sepse cdo artikull duhet te kete nje date krijimi
id_departament
- Do te jete
FOREIGN KEY
qe referencon fushenid
te tabelesdepartamentet
- Do te jete i tipit
int
pasi referencon nje fushe te ketij tipi - Nuk duhet te pranoje vleren
NULL
sepse artikujt do te kategorizohen sipas departamenteve, ndaj na sherben qe cdo artikull te jete i lidhur me nje departament
- Do te jete
njoftimet
- Do te mbaje listen e njoftimeveid
- Do te jete celes primar sepse eshte identifikues unik.
- Nuk do te pranoje vlera
NULL
sepse duhet te jete gjithnje numer, i tipitint
- Do te jete
AUTO_INCREMENT
ne menyre qe kur te shtojme njoftim te ri, id-ja te gjenerohet automatikisht
titulli
- Do te mbaje titullin e njoftimit
- Do te jete i tipit
varchar
qe pranon maksimumi 255 karaktere - Mund te pranoje vleren
NULL
pershkrimi
- Do te mbaje permbajtjen e njoftimit
- Do te jete i tipit
text
- Nuk duhet te pranoje vleren
NULL
sepse nuk ka sens nje njoftim pa permbajtje
data
- Do te mbaje daten e krijimit te njoftimit
- Do te jete i tipit
date
- Nuk duhet te pranoje vleren
NULL
sepse cdo njoftim duhet te kete nje date krijimi
id_departament
- Do te jete
FOREIGN KEY
qe referencon fushenid
te tabelesdepartamentet
- Do te jete i tipit
int
pasi referencon nje fushe te ketij tipi - Nuk duhet te pranoje vleren
NULL
sepse njoftimet do te kategorizohen sipas departamenteve, ndaj na sherben qe cdo njoftim te jete i lidhur me nje departament
- Do te jete
Ndertojme deklaratat SQL per te krijuar tabelat e mesiperme, dhe i ekzekutojme ato ne dritaren e ekzekutimit te SQL-se, ne programin MySql Workbench.
Krijojme tabelen departamentet
:
CREATE TABLE departamentet
(
id int NOT NULL AUTO_INCREMENT,
emri varchar(100) NOT NULL,
pershkrimi text,
PRIMARY KEY (id)
);
Krijojme tabelen perdoruesit
:
CREATE TABLE perdoruesit
(
id int NOT NULL AUTO_INCREMENT,
emri varchar(80) NOT NULL,
email varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
tipi SET('0', '1') DEFAULT '1',
id_departament int NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (id_departament) REFERENCES departamentet(id)
);
Ne disa raste mund te lindin probleme te tilla si p.sh. nje emer fushe qe ti kerkon te vendosesh eshte e njejte me ndonje fjale te sintakses se SQL-se. Ne kete menyre do te gjenerohej error nga SQL-ja sepse nuk do te kuptonte deklaraten. Edhe ne rastin e mesiperm termi password
eshte nje fjale qe ben pjese ne sintaksen e SQL-se. Per te menjanuar problemin qe mund te linde, fjalen password
e kam futur ndermjet dy shenjave ` (backquote), pra `password`.
Krijojme tabelen artikujt
:
CREATE TABLE artikujt
(
id int NOT NULL AUTO_INCREMENT,
titulli varchar(255) NOT NULL,
pershkrimi text NOT NULL,
data date NOT NULL,
id_departament int NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (id_departament) REFERENCES departamentet(id)
);
Krijojme tabelen njoftimet
:
CREATE TABLE njoftimet
(
id int NOT NULL AUTO_INCREMENT,
titulli varchar(255),
pershkrimi text NOT NULL,
data date NOT NULL,
id_departament int NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (id_departament) REFERENCES departamentet(id)
);
Pas ekzekutimit me radhe te deklaratave te mesiperme, do te ndertohet baza e te dhenave. Lidhjet ndermjet tabelave paraqiten ne skemen e meposhtme: